\subsection{Suavizado Gaussiano}

El objetivo de este filtro es obtener una imagen resultante con reducci'on de ruido y difuminaci'on. 
Para ello debemos procesar cada p'ixel utilizando la informaci'on de sus aleda'nos. La idea es calcluar un tipo de promedio ponderado de los valores del punto que estoy analizando con sus nueve vecinos inmediatos. En la figura \ref{tab:s-uno} podemos ver los coeficientes de multiplicaci'on de los p'ixeles.

\begin{figure}[h!]
\begin{center}
\begin{tabular}{| c | c | c |}
\hline
1/16 & 2/16 & 1/16 \\ \hline
2/16 & 4/16 & 2/16 \\ \hline
1/16 & 2/16 & 1/16 \\ \hline
\end{tabular}
\end{center}
\caption{Promedio ponderado del entorno}
\label{tab:s-uno}
\end{figure}

Con lo cual el p'ixel resultante sera el p'ixel que se encuentra en el centro del entorno, y el mismo tendra el siguiente valor:
\\
$$
\begin{array}{rl}
I_{out}(i,j) =& I_{in}(i-1,j-1) \cdot{} 1/16 + I_{in}(i-1,j) \cdot{} 2/16 + I_{in}(i-1,j+1) \cdot{} 1/16 +\\
		 & I_{in}(i+0,j-1) \cdot{} 2/16 + I_{in}(i+0,j)  \cdot{} 4/16 +  I_{in}(i+0,j+1)  \cdot{} 2/16 +\\
		 & I_{in}(i+1,j-1)  \cdot{} 1/16 + I_{in}(i+1,j) \cdot{} 2/16 + I_{in}(i+1,j+1)  \cdot{} 1/16

\end{array}
$$
\\
Aca tambi'en la implementaci'on en C es trivial teniendo la formula mencionada anteriormente. B'asicamente nos valemos de que acceder a las posiciones de la matriz en \C\ es inmediato y directo. Es decir que en cualquier momento podemos acceder a cualquier posicion de la matriz con los 'indices correspondientes. 

Por el lado de la implementacion en \ass\ vuelve a ser mas compleja. Al ver que cada p'ixel deb'ia ser la suma de su entorno ponderado, decidimos 
dividir en 3 partes el algoritmo para tratar cada una de las lineas de la matriz resultante.

Comenzamos el algoritmo realizando una lectura de 16 bytes, luego realizamos una segunda y tercer lectura sucesiva(para guarda informaci'on del entorno)
desplazando el puntero base en uno y dos bytes respectivamente. La figura \ref{est:s-dos} muestra esas lecturas. El objetivo aca nuevamente es que queden alineados los datos que necesito sumar.


\newcolumntype{C}{>{\footnotesize\centering}p{22pt}}
\begin{figure}[h!]
\xmmW{paso 1.}{a_{15}a_{14} & a_{13}a_{12} & a_{11}a_{10} & a_9a_8 & a_7a_6 & a_5a_4 & a_3a_2 & a_1a_0}
\xmmW{paso 2.}{a_{16}a_{15} & a_{14}a_{13} & a_{12}a_{11} & a_{10}a_9 & a_8a_7 & a_6a_5 & a_4a_3 & a_2a_1}
\xmmW{paso 3.}{a_{17}a_{16} & a_{15}a_{14} & a_{13}a_{12} & a_{11}a_{10} & a_9a_8 & a_7a_6 & a_5a_4 & a_3a_2}
\caption{Levantado de datos de la primer linea}
\label{est:s-dos}
\end{figure}
\newcolumntype{C}{>{\footnotesize\centering}p{18pt}}

Luego desempaquetamos los datos para operar como words, obteniendo asi dos registros por cada uno de los anteriores, uno para la parte baja y otro para la alta. Es importante destacar que los desempaquetamientos siempre los hacemos con registros que tienen todo ceros, de esta manera el valor que nos interesa se ve inalterado. 

Luego se utiliza la operaci'on \textit{psllw} para realizar un desplazamiento empaquetado de a words de un bit (que ser'ia equivalente a multiplicar por 2) en los registros de la segunda lectura y sumamos las partes bajas guard'andolas en los acumuladores.

Ya procesada la primer linea del entorno procedemos a la segunda. Sumamos a nuestro 'indice el ancho de la 
im'agen (contemplando el \textit{padding}) para pararnos en la segunda fila de la matriz, realizamos nuevamente tres lecturas desplazadas, desempaquetamos y multiplicamos los registros por sus correspondientes valores. En este caso 4 para el centro y 2 para los extremos. Aca nuevamente utilizamos instrucciones de desplazamiento para la multiplicaci'on. Una vez procesada la parte alta y baja de la segunda linea, la acumulamos con los resultados de la primera.

Por 'ultimo pasamos a la tercer linea de la misma manera que la anterior, y realizamos el mismo procedimiento: tres lecturas desfazadas, desempaquetamos,  multiplicamos, y acumulamos los valores correspondientes a la parte alta y parte baja. En este punto s'olo nos queda dividirlos por 16. Lo realizamos nuevamente con una operaci'on de desplazamiento de bits. 

Ahora solo nos queda empaquetar los datos con saturaci'on y escribirlos en la imagen destino. Es importante notar que en este algoritmo utilizamos muchos registros debido a las lecturas desplazadas. En cierto punto no tuvimos mas registros libres por lo que tuvimos que utilizar una variable local de 16 bytes para guardar uno de los acumuladores. Que como trabajo a futuro ver si es posible realizar una implementaci'on que no utilice esa memoria auxiliar, ni que realice tantos accesos a memoria. Probablemente utilizando la misma estrategia aqui descripta pero procesando de a menos datos, es decir utilizando solamente las informaci'on que obtenemos con una sola lectura y no con tres desfazadas.

\subsubsection*{Iterando la imagen}

Primero tuvimos que tener en cuenta ciertas limitaciones en la el c'alculo de los p'ixeles que nos impon'ia el procedimiento, ya que al utilizar un entorno de 3x3 para calcular el p'ixel del centro, en los bordes no es posible calcularlo. Es por esto que nuestro algoritmo recorre todo menos los bordes de la imagen de entrada. 

Por otro lado, en ciclo se leen mas de 16 p'ixeles, a diferencia de los otros algoritmos, ya que al realizar 3 lecturas moviendose de a 1 p'ixel se estan levantando 18 y se procesan solo 15. Entonces debemos asegurarnos de siempre tener esos 18 p'ixeles delante nuestro. Si no los tenemos debemos realizar el reajuste para procesar los 'ultimos p'ixeles. 
